#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
#include<sys/socket.h>
#include<sys/epoll.h>
#include<arpa/inet.h>
#include<ctype.h>
int main(void)
{
    struct sockaddr_in serv_addr,clit_addr;
    char buf[1024];
    socklen_t clit_len;
    int len;
    int lfd,cfd;
    lfd=socket(AF_INET,SOCK_STREAM,0);
    memset(&serv_addr,0,sizeof(serv_addr));
    serv_addr.sin_family=AF_INET;
    serv_addr.sin_port=htons(9999);
    serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
    bind(lfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr));
    listen(lfd,128);
    
    struct epoll_event event,eventArr[1024];
    /*不在设置lfd的监听事件，默认有客户端直接发出请求*/
    int efd=epoll_create(10);
    
    clit_len=sizeof(clit_addr);
    cfd=accept(lfd,(struct sockaddr*)&clit_addr,&clit_len);//client直接发出请求
    
    //将cfd放置红黑树上进行监听
    event.events=EPOLLIN | EPOLLET; //设置监听的cfd为边缘触发
    event.data.fd=cfd;
    epoll_ctl(efd,EPOLL_CTL_ADD,cfd,&event);//将cfd 放置在红黑树上进行监听
    while(1)
    {
        int ret=epoll_wait(efd,eventArr,10,-1);//阻塞监听cfd的读事件发生
        //只有一个client访问，不需要轮训
        if(eventArr[0].data.fd==cfd)
        {
            len=read(cfd,buf,5);
            write(STDOUT_FILENO,buf,len);
        }

    }


    return 0;
}
